Paradigmas da Programação I
ESI (5301P3) / MCC (7001N4)
18 de Fevereiro de 2000
Questão 1
Para armazenar a informação respeitante aos alunos de PP1 usamos o
seguinte tipo:
data Alunos = Vazia | Nodo (Numero,Nome) Alunos Alunos
type Numero = Int
type Nome = String
Note que esta definição corresponde a uma árvore binária cujos
elementos são do tipo (Numero,Nome).
Além disso vamos usar árvores de procura, i.e., árvores ordenadas pelo
número do aluno.
Por exemplo, para guardar a informação referente aos alunos
1234 |
Xico |
2345 |
Maria |
3456 |
Manel |
4567 |
Sara |
Poder-se-ia usar a árvore da esquerda mas não a da direita
(3456,"Manel") (3456,"Manel")
/ \ / \
/ \ / \
/ \ / \
(1234,"Xico") (4657,"Sara) (2345,"Maria") (4657,"Sara")
\ /
\ /
\ /
(2345,"Maria") (1234,"Xico")
- 1.
- Qual o termo (do tipo Alunos) que representa a árvore da
esquerda?
- 2.
- Defina uma função inscrito :: Alunos -> Numero -> Bool
que teste se um aluno está inscrito em PP1.
- 3.
- Defina uma função nome :: Alunos -> Numero -> Maybe Nome
que determina o nome de um aluno (Nothing no caso de o
aluno não estar inscrito).
- 4.
- Defina a função lista :: Alunos -> [Nome] que calcule a
lista dos nomes dos alunos (por ordem crescente do número).
Questão 2
Considere o seguinte tipo para representar linhas poligonais
type Ponto = (Float,Float)
type Poligonal = (Ponto, [Ponto]) -- (inicial, restantes)
type Delta = [(Float,Float)] -- (deltax, deltay)
Pretende-se definir uma função zoom :: Poligonal -> Float ->
Poligonal que escale uma figura de um determinado factor
(multiplicativo), mantendo o seu ponto inicial. Assim, por exemplo,
ao escalarmos a linha poligonal
l = ((1,1),[(2,2),(2,4),(5,4)])
de um factor de 2, obtemos a linha poligonal
((1,1),[(3,3),(3,7),(9,7)])
- 1.
- Comece por definir uma função delta :: Poligonal ->
Delta que transforma os pontos de uma linha em deslocamentos
relativos ao ponto anterior; no exemplo de cima
delta l = [(1,1),(0,2),(3,0)]
- 2.
- Defina agora a função undeltas :: Ponto -> Delta ->
Poligonal, inversa da anterior , i.e., a função que
dado um ponto inicial e uma lista de deslocamentos relativos,
calcula uma linha poligonal. Continuando no mesmo exemplo,
undeltas (1,1) [(2,2),(0,4),(6,0)] deve dar como
resultado
((1,1),[(3,3),(3,7),(9,7)])
- 3.
- Defina uma função multiplica :: Float -> Delta -> Delta
que, dado um factor e uma lista de deslocamentos, retorna a
lista de deslocamentos multiplicados pelo factor.
- 4.
- Use as funções anteriores para definir a função zoom
referida acima.
Questão 3
Apresente, definições em HASKELL para responder às alíneas
seguintes.
- 1.
- Apresente uma definição recursiva e uma outra usando a função de
ordem superior filter de uma função que, dados um
carácter e uma palavra, determine o número de ocorrências desse
carácter nessa palavra. Qual o tipo da função que definiu?
- 2.
- Defina uma função que, dado um carácter e uma palavra, determine
a posição onde esse carácter ocorre pela última vez na palavra.
- 3.
- Defina uma função que, dadas duas palavras, verifique se uma
delas está contida na outra; por exemplo, a palavra
norma está contida na palavra anormal.
Questão 4
Complete a seguinte definição
data BTree a = Vazia | Nodo a (BTree a) (BTree a)
class Eq a where
(==) :: a -> a -> Bool
instance (Eq a) => Eq (BTree a) where ...
Questão 5
Seja t definido por
t = filter id [True,False,True]
Indique o tipo e o valor de t.
Explique por palavras suas o significado de t.
Questão 6
Suponha o seguinte tipo de dados que pretende armazenar uma
sequência de transformações a aplicar a um elemento inicial (cada
transformação é representada por uma função a aplicar ao elemento
anterior):
data Trans a = T a [a->a]
Defina Trans a como uma instância da classe Show,
de forma que que o resultado de
exemplo = T 0 [(+5),(*2)]
putStr (show exemplo)
seja
0 -> 5 -> 10
José Bernardo Barros
2000-02-18